package com.fas.core.plugin.shiro.session;

import java.io.Serializable;

import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.ValidatingSession;
import org.apache.shiro.session.mgt.eis.CachingSessionDAO;

import com.fas.core.util.SerializableUtils;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
/**
 * 
 * 将SESSION保存数据库
 *
 * @Copyright: Copyright (c) 2016 FAS 
 * @anthor yixiaoping<thinker1013@163.com>
 * @since 2016年1月24日 下午10:13:11
 * @version V1.0
 */
public class DbSessionDAO extends CachingSessionDAO {
	/**
	 * 更新会话；如更新会话最后访问时间/停止会话/设置超时时间/设置移除属性等会调用
	 */
	@Override
	protected void doUpdate(Session session) {
		if (session instanceof ValidatingSession && !((ValidatingSession) session).isValid()) {
			return; // 如果会话过期/停止没必要再更新了
		}
		String sql = "update sessions set session=? where id=?";
		Db.update(sql, SerializableUtils.serialize(session), session.getId());
	}

	/**
	 * 删除会话；当会话过期/会话停止（如用户退出时）会调用
	 */
	@Override
	protected void doDelete(Session session) {
		String sql = "delete from sessions where id=?";
		Db.update(sql, session.getId());
	}

	@Override
	protected Serializable doCreate(Session session) {
		Serializable sessionId = generateSessionId(session);
		assignSessionId(session, sessionId);
		String sql = "insert into sessions(id, session) values(?,?)";
		Db.update(sql, sessionId, SerializableUtils.serialize(session));
		return session.getId();
	}

	/**
	 * 获取当前所有活跃用户，如果用户量多此方法影响性能
	 */
	@Override
	protected Session doReadSession(Serializable sessionId) {
		String sql = "select session as s from sessions where id=?";
		Record record = Db.findFirst(sql,sessionId);
		if(record == null) return null;
        return SerializableUtils.deserialize(record.getStr("s"));
	}

}
